package com.silverbox.sweeporder.service.shopcart;

import java.util.List;
import java.util.Map;

import com.silverbox.core.result.CoreResponse;
import com.silverbox.core.result.CoreResponse.StatusInfo;
import com.silverbox.shopper.entity.Shopper;
import com.silverbox.sweeporder.controller.index.vo.ShopperConfigExtend;
import com.silverbox.sweeporder.controller.shopcart.entryvo.*;
import com.silverbox.sweeporder.controller.shopcart.outvo.IndexCartVO;
import com.silverbox.sweeporder.controller.shopcart.outvo.SaveShopCartVO;
import com.silverbox.sweeporder.controller.shopcart.outvo.ShopCartVO;
import com.silverbox.sweeporder.controller.waimai.entryvo.CouponBaseDto;
import com.silverbox.waimai.entity.GoodsCart;
import com.silverbox.waimai.entity.extend.GoodsCartAndDetail;
import com.silverbox.waimai.entity.extend.GoodsCartExtend;

public interface ShopCartService {

	/**
	 * 获取购物车商品
	 *
	 * @param firstPayMent
	 * @param isOpenDeskmateSinglePoint
	 * @return List<GoodsCart>  
	 * @throws
	 * @author litao
	 * @date 2017年12月27日
	 */
	List<GoodsCartAndDetail> getShopCart(Integer storeId, String tableName, String buyerId,Integer clientOrderMode, Integer firstPayMent, Integer isOpenDeskmateSinglePoint);

	/**
	 * 清空购物车所有商品
	 * 
	 * @param @param id
	 * @param @param name   
	 * @return void  
	 * @throws
	 * @author litao
	 * @date 2017年12月27日
	 */
	void deleteGoodsCart(Integer storeId, String buyerId, String tableName,Integer mustOrder,String isClearOrder);

	/**
	 * 根据购物车Id修改商品数量
	 *
	 * @return void  
	 * @throws
	 * @author litao
	 * @date 2017年12月28日
	 */
	Integer updateGoodsCartById(GoodsCart goodsCart);

	/**
	 * 根据购物车Id获取购物车商品信息
	 * 
	 * @param @param goodsCartId   
	 * @return void  
	 * @throws
	 * @author litao
	 * @date 2018年1月4日
	 */
	GoodsCartAndDetail getShopCartById(Integer goodsCartId);

	/**
	 * 获取购物车打包的商品
	 * @param @param storeId
	 * @param @param buyerId
	 * @param @param tableNo
	 * @param @param goodsId
	 * @param @param sizeId
	 * @param @param propIds
	 * @param @param string   
	 * @return void  
	 * @throws
	 * @author litao
	 * @date 2018年1月10日
	 */
	Integer getShopCartByPack(GoodsCartExtend goodsCart);

	/**
	 * 删除购物车内相同商品数据
	 * 
	 * @param @param goods
	 * @param @return   
	 * @return Object  
	 * @throws
	 * @author litao
	 * @date 2018年1月10日
	 */
	boolean deleteShopCartByPack(GoodsCartExtend goods);

	/**
	 * 修改打包商品
	 * @param @param id
	 * @param @param tableName
	 * @param @param string
	 * @param @param goodsDesc   
	 * @return void  
	 * @throws
	 * @author litao
	 * @date 2018年1月11日
	 */
	void updateGoodsCartByGoodsDesc(Integer storeId, String tableName, String buyerId, String goodsDesc);

	/**
	 * 点餐页面获取商品数据
	 *
	 * @return CoreResponse<IndexCartVO>
	 * @author litao
	 * @date 2018年1月22日
	 */
	CoreResponse<IndexCartVO> getShopCartbyIndex(ShopCartIndexQueryDto shopCartIndexQueryVo );

	/**
	 * 购物车修改商品属性接口
	 * @param  shopCartProp   
	 * @author litao
	 * @date 2018年1月22日
	 */
	CoreResponse<StatusInfo> updateShopCartProp(ShopCartPropEntryVO shopCartProp);

	/**
	 * 更新或删除购物车商品
	 * 
	 * @param goodsCart
	 * @return CoreResponse<StatusInfo>
	 * @author litao
	 * @date 2018年1月23日
	 */
	CoreResponse<StatusInfo> updateOrDeleteShopCartById(UpdateCartEntryVO goodsCart);
	
	/**
	 * 添加购物车商品
	 * 
	 * @throws
	 * @author litao
	 * @date 2017年12月27日
	 */
	CoreResponse<SaveShopCartVO> saveOrUpdateShopCartV2(SaveShopCartEntryVO goodsCartVO);

	/**
	 * 单个商品打包（拆分）
	 * 
	 * @param singlePackEntry   
	 * @return void  
	 * @throws
	 * @author litao
	 * @date 2018年5月14日
	 */
	CoreResponse<Map<String,Object>> updateSinglePackGoods(SinglePackEntryVO singlePackEntry);

	/**
	 * 整单打包修改购物车
	 * @param allPackEntry   
	 * @return void  
	 * @throws
	 * @author litao
	 * @date 2018年5月14日
	 */
	CoreResponse<Map<String, Integer>> updateAllPackGoods(AllPackEntryVO allPackEntry);

	/**
	 * 取消单个商品打包(合并)修改购物车
	 * @param goodsCartId   
	 * @return void  
	 * @throws
	 * @author litao
	 * @date 2018年5月14日
	 */
	CoreResponse<Map<String,Integer>> updateRemoveSinglePackGoods(Integer goodsCartId);
    
	/**
	 * 购物车页面删除商品
	 * @param shopCartIdEntryVO
	 * @return
	 */
	CoreResponse<Map<String,Object>> deleteShopCartById(DeleteShopCartIdEntryVO shopCartIdEntryVO);
	
	/**
	 * 清空购物车删除可修改的必选菜
	 * @param storeId
	 * @param buyerId
	 * @param tableName
	 */
	void updateNeedGoods(Integer storeId, String buyerId, String tableName);


    CoreResponse<ShopCartVO> getShopCartbyPage(ShopCartPageQueryDto shopCartPageQueryVo, Integer clientType);


    Double calcPromotionPriceByGoodsCart(Double totalPrice, List<GoodsCartAndDetail> goodsList, CouponBaseDto couponBaseDto, Shopper shopper, ShopperConfigExtend shopperConfigExtend);
}
